package com.jt.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.User;
import com.jt.service.DubboUserService;
import com.jt.service.HttpClientService;
import com.jt.util.CookieUtil;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import redis.clients.jedis.JedisCluster;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

@Controller
@RequestMapping("/user")
public class UserController {

    //使用常量定义cookie名称
    private static final String JT_TICKET = "JT_TICKET";

    @Autowired
    private HttpClientService httpClientService;
    //为接口创建代理对象进行注入,之后通过PRC访问服务生产者
    @Reference(check = false)
    private DubboUserService userService;

    @Autowired
    private JedisCluster jedisCluster;

    /**
     * 实现用户页面的通用跳转
     * url1: http://www.jt.com/user/login.html        login.jsp
     * url2: http://www.jt.com/user/register.html     register.jsp
     */
    @RequestMapping("/{moduleName}")
    public String moduleName(@PathVariable String moduleName) {

        return moduleName;
    }

    /**
     * 完成HttpClient测试
     * 1.url地址: http://www.jt.com/user/findUserList
     * 2.请求参数: 无
     * 3.返回值结果: List<User>集合
     */
    @RequestMapping("/findUserList")
    @ResponseBody
    public List<User> findUserList() {

        return httpClientService.findUserList();
    }

    /**
     * 完成用户注册操作
     * 1.url地址:http://www.jt.com/user/doRegister
     * 2.参数:password:admin123
     * username:admin12332412341234
     * phone:13111112227
     * 3.返回值:SysResult对象
     */
    @RequestMapping("/doRegister")
    @ResponseBody//将返回值结果转化为JSON
    public SysResult saveUser(User user) {
        userService.saveUser(user);
        return SysResult.success();
    }

    /**
     * 业务需求：
     * 实现用户单点登录操作：
     * 1.url :http://www.jt.com/user/doLogin?r=0.035224645755061346
     * 2.请求参数：  username: admin123
     * password: admin123456
     * 3.返回值结果SysResult对象
     * <p>
     * 实现Cookie数据存储：
     * 1.获取用户名和密码进行数据验证
     * 2.获取后端的密钥信息   是否为空?
     * 3.如果一切正常,则将数据存储到cookie中 : 路径/有效期/共享问题
     * <p>
     * 关于cookie的说明:
     * 1.cookie只能看到自己域名下的cookie  是私有的
     * 2.setPath说明:
     * setPath("/") 读取cookie权限的设定
     * setPath("/user") url地址路径/user时,才能获取Cookie信息
     * url1: http://www.jt.com/findUser
     * url2: http://www.jt.com/user/findUser
     */
    @RequestMapping("/doLogin")
    @ResponseBody
    public SysResult userLogin(User user, HttpServletResponse response) {
        String ticket = userService.findUserByUP(user);
        if (!StringUtils.hasLength(ticket)) {
            // 如果数据为null则表示用户名和密码错误...
            return SysResult.fail();
        }
        //需要将数据保存到Cookie中
        Cookie cookie = new Cookie("JT_TICKET", ticket);
        cookie.setPath("/");  //设置允许访问的路径
        cookie.setMaxAge(7 * 24 * 60 * 60); //设定有效期 7天
        cookie.setDomain("jt.com"); //只要域名中有jt.com 则可以共享数据
        response.addCookie(cookie); //将数据写入客户端

        return SysResult.success();
    }

    /**
     * 完成用户退出操作
     * 1.重定向到系统首页
     * 2.url地址:http://www.jt.com/user/logout.html
     */
    @RequestMapping("/logout")
    public String logOut(HttpServletRequest request, HttpServletResponse response) {
        /*// 获取cookies的列表
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies){
                if (JT_TICKET.equals(cookie.getName())){
                    String ticket = cookie.getValue();
                    //删除redis数据
                    jedisCluster.del(ticket);
                    //删除cookie的数据
                    cookie.setMaxAge(0); // 0表示立即删除 -1表示关闭浏览器后删除
                    cookie.setPath("/");
                    cookie.setDomain("jt.com");
                    // 新增cookie替换原有cookie
                    response.addCookie(cookie);
                }
            }
        }
        return "redirect:/";*/
        String ticket = CookieUtil.getCookieValue(request,JT_TICKET);
        if (StringUtils.hasLength(ticket)){
            //1.删除redis
            jedisCluster.del(ticket);
            //2.删除cookie(刚写好的cookieutil)
            CookieUtil.addCookie(response,JT_TICKET,"","/","jt.com",0);
        }
        return "redirect:/";
    }






}

